﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.Data;
using System.ComponentModel;
using System.Reflection;
using produccion.AccesoDatos;
using produccion.modelo;
using produccion.clases;
using System.Windows.Controls.DataVisualization;
using System.Windows.Controls.Primitives;
using System.Windows.Controls.DataVisualization.Charting;


namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FRMmenu.xaml
    /// </summary>
    public partial class FRMmenu : Window
    {
        menu _menu;
        CLSMAEUSUP usu = new CLSMAEUSUP();
        
        public FRMmenu()
        {
            MDOgeneral.conectar();
            InitializeComponent();
            _menu =(menu) this.DataContext;
            _menu.wPNot = wPnot;
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                MDOgeneral.DesconectarBogota();//FJRF - Si esta conectado nos desconectamos

                FRMlogin FrmLogin = new FRMlogin();//FJRF - Traemos los objetos de login

                if (MDOgeneral.conexion.State != ConnectionState.Open)
                {
                    MDOgeneral.conectar();
                }
                if (MDOgeneral.BooConexionDinamica == true)
                {
                    _menu.menuEca = "Usuario:   " + MDOgeneral.usuario + "     Fecha:   " + DateTime.Today.ToString("dd-MM-yyyy") + "                         SISTEMA DE PRODUCCION - VERSIÓN A FECHA [ " + FrmLogin.LblVersion.Content + " ]";
                }
                else
                {
                    _menu.menuEca = "ADVERTENCIA... SE ESTA TRABAJANDO EN UNA BASE DE DATOS DE PRUEBA... LOS DATOS QUE SE MANIPULEN NO SE REFLEJARAN EN LA BASE DE DATOS REAL";
                }

                
                _menu.consultar();
                usu.CODUSU_USU = MDOgeneral.usuario;
                usu.consultar();
                _menu.logVerGrafico = usu.USAINDGES_USU == "S" ? true : false;

                if (_menu.logVerGrafico == true)
                { 
                    ActulizarGraficas("Z");
                    _menu.logVerGrafico = true;
                }
                texBusMenu.Focus();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void ActulizarGraficas(string strGrafico)
        {
            try
            {
                _menu.cargarGraficos(strGrafico);
                actGraficas();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        private void Window_Closing(object sender, CancelEventArgs e)
        {
            if (MessageBox.Show("¿Está seguro que desea salir de la aplicacion? se cerraran todas las ventanas abiertas.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)
            {
                e.Cancel = true;
            }
            else
            {
                if (MDOgeneral.conexion.State == ConnectionState.Open)
                {
                    MDOgeneral.desconectar();
                }
                Application.Current.Shutdown();
            }            
        }

        //Buscar en Menu
        private void botMenBus_Click(object sender, RoutedEventArgs e)
        {
            treeViewMen.Focus();
            _menu.PerformSearch();
            texBusMenu.Focus();
        }
        private void texBusFav_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.Key.Equals(Key.Enter))
            {
                botFavBus_Click(null, null);
            }
        }

        //Buscar en favoritos
        private void botFavBus_Click(object sender, RoutedEventArgs e)
        {
            if (_menu.lisfav.Count > 0)
            {
                listFav.Focus();
                _menu.PerformSearchfav();
                listFav.ScrollIntoView(listFav.Items[_menu.Indexf]);
                texBusFav.Focus();
            }
        }
        private void texBusMenu_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.Key.Equals(Key.Enter)) 
            {
                botMenBus_Click(null, null);
            }
        }

        private void treeViewMen_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            TreeView tree = (TreeView)sender;
            _menu.sel = (menu.arbol)tree.SelectedItem;
        }
        private void TreeViewItem_Selected(object sender, RoutedEventArgs e)
        {
            TreeViewItem s = (TreeViewItem)sender;
            if (_menu.camm) 
            {
                s.Focus();
                texBusMenu.Focus();
                _menu.camm = false;
            }
        }

        //Agregar favorito
        private void MenuItem_Click(object sender, RoutedEventArgs e)
        {
            _menu.AgregarFav();
        }

        //Quitar favorito
        private void MenufavItem_Click(object sender, RoutedEventArgs e)
        {
            _menu.QuitarFav();
        }
        private void QuitFav_Click(object sender, RoutedEventArgs e)
        {
            if (MessageBox.Show("¿Está seguro que desea quitar la opcion?", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.OK)
            {
                MenufavItem_Click(null, null);
            }
        }

        //Ordenar subir favorito
        private void favOrdSub_Click(object sender, RoutedEventArgs e)
        {
            if (_menu.lisfav.Count > 0 && _menu.Indexf!=-1)
            {
                _menu.SubirFav();
                listFav.ScrollIntoView(listFav.Items[_menu.Indexf]);
            }
        }

        //Ordenar bajar favorito
        private void favOrdBaj_Click(object sender, RoutedEventArgs e)
        {
            if (_menu.lisfav.Count > 0 && _menu.Indexf != -1)
            {
                _menu.BajarFav();
                listFav.ScrollIntoView(listFav.Items[_menu.Indexf]);
            }
        }
       
        //Abrir desde favoritos
        private void listFav_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (e.ClickCount == 1)
            {
                AbrirFormulario(_menu.self.FORMUL_OPC, !String.IsNullOrEmpty(_menu.self.CODUSU_OPU));
            }
        }
        private void ListBoxItem_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.Key.Equals(Key.Enter))
            {
                AbrirFormulario(_menu.self.FORMUL_OPC, !String.IsNullOrEmpty(_menu.self.CODUSU_OPU));
            }
        }
      
        //Abrir desde menu
        private void treeViewMen_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (_menu.sel != null)
            {
                if (_menu.sel.tipo != null)
                {
                    if (_menu.sel.tipo.Equals("A"))
                    {
                        AbrirFormulario(_menu.sel.formulario, !String.IsNullOrEmpty(_menu.sel.usuario));
                    }
                }
            }
        }
        private void treeViewMen_KeyUp(object sender, KeyEventArgs e)
        {
            if (_menu.sel.tipo != null)
            {
                if (_menu.sel.tipo.Equals("A") && e.Key == Key.Enter && !menuvisible)
                {
                    AbrirFormulario(_menu.sel.formulario, !String.IsNullOrEmpty(_menu.sel.usuario));
                }
            }
        }

        //MenuContex Visible o no sobre treeview
        Boolean menuvisible = false;
        private void ContextMenu_Opened(object sender, RoutedEventArgs e)
        {
            menuvisible = true;
        }
        private void ContextMenu_Closed(object sender, RoutedEventArgs e)
        {
            menuvisible = false;
        }

        public void AbrirFormulario(string formulario,Boolean permiso) 
        {        
            if (!permiso) 
            {
                new MDOgeneral.notificar(wPnot, "No posee los permisos necesarios para abrir la opción.", false);
                return;
            }
            try
            {
                Assembly asm = Assembly.GetEntryAssembly();
                Type formtype = asm.GetType("produccion.forms." + formulario);
                if (formtype == null) {
                    new MDOgeneral.notificar(wPnot,"La opcion que desea abrir no se encuentra instalada.",false);
                    return;
                }
                Window w = (Window)Activator.CreateInstance(formtype);
                w.Show();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void KeyUp_tabReturn(object sender, KeyEventArgs e)
        {
            
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }

        private void btnBoton1_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _menu.cargarGraficos("1");
                actGraficas();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void btnBoton2_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _menu.cargarGraficos("2");
                actGraficas();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void btnBoton3_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _menu.cargarGraficos("3");
                actGraficas();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void btnBoton4_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _menu.cargarGraficos("4");
                actGraficas();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void btnBoton5_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _menu.cargarGraficos("5");
                actGraficas();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void btnBoton6_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _menu.cargarGraficos("6");
                actGraficas();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void btnBoton7_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _menu.cargarGraficos("7");
                actGraficas();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void btnBoton8_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _menu.cargarGraficos("8");
                actGraficas();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void btnBoton9_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _menu.cargarGraficos("9");
                actGraficas();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void btnBoton10_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _menu.cargarGraficos("10");
                actGraficas();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void btnBoton11_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _menu.cargarGraficos("11");
                actGraficas();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void btnBoton12_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _menu.cargarGraficos("12");
                actGraficas();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void actGraficas()
        {
            try
            {
                ((ColumnSeries)Grafico1.Series[0]).ItemsSource = "";
                ((ColumnSeries)Grafico1.Series[1]).ItemsSource = "";
                ((ColumnSeries)Grafico2.Series[0]).ItemsSource = "";
                ((ColumnSeries)Grafico1.Series[0]).ItemsSource = _menu.listabla1;
                ((ColumnSeries)Grafico1.Series[1]).ItemsSource = _menu.listabla2;
                ((ColumnSeries)Grafico2.Series[0]).ItemsSource = _menu.listabla1;

                dtgTabla1.ItemsSource = "";
                dtgTabla2.ItemsSource = "";
                dtgTabla1.ItemsSource = _menu.listado1;
                dtgTabla2.ItemsSource = _menu.listado2;

                dtgTabla1.Columns[0].Header = _menu.strNombreColumna1;
                dtgTabla1.Columns[1].Header = _menu.strNombreColumna2;
                dtgTabla1.Columns[2].Header = _menu.strNombreColumna3;
                dtgTabla2.Columns[0].Header = _menu.strNombreColumna1;
                dtgTabla2.Columns[1].Header = _menu.strNombreColumna2;
                
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        
    }

    public class menu:ObservableObject
    {

    #region propiedades

        private ObservableCollection<arbol> _hijos=new ObservableCollection<arbol>();
        public ObservableCollection<arbol> hijos
        {
            get { return _hijos; }
            set { _hijos = value; RaisePropertyChangedEvent("hijos"); }
        }

        private arbol _sel = new arbol ();
        public  arbol sel
        {
            get { return _sel; }
            set { _sel = value; RaisePropertyChangedEvent("sel"); }
        }

        private arbol _padre = new arbol {id=0,nombre="" };
        public arbol padre
        {
            get { return _padre; }
            set { _padre = value; RaisePropertyChangedEvent("padre"); }
        }

        private ObservableCollection<favorito> _lisfav = new ObservableCollection<favorito>();
        public ObservableCollection<favorito> lisfav
        {
            get { return _lisfav; }
            set { _lisfav = value; RaisePropertyChangedEvent("lisfav"); }
        }

        private favorito _self = new favorito();
        public favorito self
        {
            get { return _self; }
            set { _self = value; RaisePropertyChangedEvent("self"); }
        }

        private string _texMenBus;
        public string texMenBus
        {
            get { return _texMenBus; }
            set 
            { 
                _texMenBus = value;
                RaisePropertyChangedEvent("texMenBus");
                _buscandoapp = null;
            }
        }

        private string _texFavBus;
        public string texFavBus
        {
            get { return _texFavBus; }
            set {   _texFavBus = value; RaisePropertyChangedEvent("texFavBus"); }
        }

        private WrapPanel _wPNot;
        public WrapPanel wPNot 
        {
            get { return _wPNot; }
            set { _wPNot = value; }
        }

        private string _menuEca;
        public string menuEca
        {
            get { return _menuEca; }
            set { _menuEca = value; RaisePropertyChangedEvent("menuEca"); }
        }

        private int _Indexf;
        public int Indexf
        {
            get { return _Indexf; }
            set { _Indexf = value; RaisePropertyChangedEvent("Indexf"); }
        }

        private Boolean _camm=false;
        public Boolean camm
        {
            get { return _camm; }
            set { _camm = value; RaisePropertyChangedEvent("camm"); }
        }


        //-------------------------------------------------------- Propiedades graficos

        private string _strNombreColumna1;
        public string strNombreColumna1
        {
            get { return _strNombreColumna1; }
            set { _strNombreColumna1 = value; RaisePropertyChangedEvent("strNombreColumna1"); }
        }

        private string _strNombreColumna2;
        public string strNombreColumna2
        {
            get { return _strNombreColumna2; }
            set { _strNombreColumna2=value; RaisePropertyChangedEvent("strNombreColumna2"); }
        }

        private string _strNombreColumna3;
        public string strNombreColumna3
        {
            get { return _strNombreColumna3; }
            set { _strNombreColumna3 = value; RaisePropertyChangedEvent("strNombreColumna3"); }
        }

        private string _strNombreGrafico;
        public string strNombreGrafico
        {
            get { return _strNombreGrafico; }
            set { _strNombreGrafico = value; RaisePropertyChangedEvent("strNombreGrafico"); }
        }

        private string _strNombreGrafico1;
        public string strNombreGrafico1
        {
            get { return _strNombreGrafico1; }
            set { _strNombreGrafico1 = value; RaisePropertyChangedEvent("strNombreGrafico1"); }
        }

        private string _strNombreGrafico2;
        public string strNombreGrafico2
        {
            get { return _strNombreGrafico2; }
            set { _strNombreGrafico2 = value; RaisePropertyChangedEvent("strNombreGrafico2"); }
        }

        private string _strNombreGrafico3;
        public string strNombreGrafico3
        {
            get { return _strNombreGrafico3; }
            set { _strNombreGrafico3 = value; RaisePropertyChangedEvent("strNombreGrafico3"); }
        }

        private string _strNombreGrafico4;
        public string strNombreGrafico4
        {
            get { return _strNombreGrafico4; }
            set { _strNombreGrafico4 = value; RaisePropertyChangedEvent("strNombreGrafico4"); }
        }

        private string _strNombreGrafico5;
        public string strNombreGrafico5
        {
            get { return _strNombreGrafico5; }
            set { _strNombreGrafico5 = value; RaisePropertyChangedEvent("strNombreGrafico5"); }
        }

        private string _strNombreGrafico6;
        public string strNombreGrafico6
        {
            get { return _strNombreGrafico6; }
            set { _strNombreGrafico6 = value; RaisePropertyChangedEvent("strNombreGrafico6"); }
        }

        private string _strNombreGrafico7;
        public string strNombreGrafico7
        {
            get { return _strNombreGrafico7; }
            set { _strNombreGrafico7 = value; RaisePropertyChangedEvent("strNombreGrafico7"); }
        }

        private string _strNombreGrafico8;
        public string strNombreGrafico8
        {
            get { return _strNombreGrafico8; }
            set { _strNombreGrafico8 = value; RaisePropertyChangedEvent("strNombreGrafico8"); }
        }

        private string _strNombreGrafico9;
        public string strNombreGrafico9
        {
            get { return _strNombreGrafico9; }
            set { _strNombreGrafico9 = value; RaisePropertyChangedEvent("strNombreGrafico9"); }
        }

        private string _strNombreGrafico10;
        public string strNombreGrafico10
        {
            get { return _strNombreGrafico10; }
            set { _strNombreGrafico10 = value; RaisePropertyChangedEvent("strNombreGrafico10"); }
        }

        private string _strNombreGrafico11;
        public string strNombreGrafico11
        {
            get { return _strNombreGrafico11; }
            set { _strNombreGrafico11 = value; RaisePropertyChangedEvent("strNombreGrafico11"); }
        }

        private string _strNombreGrafico12;
        public string strNombreGrafico12
        {
            get { return _strNombreGrafico12; }
            set { _strNombreGrafico12 = value; RaisePropertyChangedEvent("strNombreGrafico12"); }
        }

        private Boolean _logVerGrafico = false;
        public Boolean logVerGrafico
        {
            get { return _logVerGrafico; }
            set { _logVerGrafico = value; RaisePropertyChangedEvent("logVerGrafico"); }
        }

        private Boolean _logVerGrafico1 = true;
        public Boolean logVerGrafico1
        {
            get { return _logVerGrafico1; }
            set { _logVerGrafico1 = value; RaisePropertyChangedEvent("logVerGrafico1"); }
        }

        private Boolean _logVerGrafico2 = false;
        public Boolean logVerGrafico2
        {
            get { return _logVerGrafico2; }
            set { _logVerGrafico2 = value; RaisePropertyChangedEvent("logVerGrafico2"); }
        }

        private Boolean _logVerBoton1 = false;
        public Boolean logVerBoton1
        {
            get { return _logVerBoton1; }
            set { _logVerBoton1 = value; RaisePropertyChangedEvent("logVerBoton1"); }
        }

        private Boolean _logVerBoton2 = false;
        public Boolean logVerBoton2
        {
            get { return _logVerBoton2; }
            set { _logVerBoton2 = value; RaisePropertyChangedEvent("logVerBoton2"); }
        }

        private Boolean _logVerBoton3 = false;
        public Boolean logVerBoton3
        {
            get { return _logVerBoton3; }
            set { _logVerBoton3 = value; RaisePropertyChangedEvent("logVerBoton3"); }
        }

        private Boolean _logVerBoton4 = false;
        public Boolean logVerBoton4
        {
            get { return _logVerBoton4; }
            set { _logVerBoton4 = value; RaisePropertyChangedEvent("logVerBoton4"); }
        }

        private Boolean _logVerBoton5 = false;
        public Boolean logVerBoton5
        {
            get { return _logVerBoton5; }
            set { _logVerBoton5 = value; RaisePropertyChangedEvent("logVerBoton5"); }
        }

        private Boolean _logVerBoton6 = false;
        public Boolean logVerBoton6
        {
            get { return _logVerBoton6; }
            set { _logVerBoton6 = value; RaisePropertyChangedEvent("logVerBoton6"); }
        }

        private Boolean _logVerBoton7 = false;
        public Boolean logVerBoton7
        {
            get { return _logVerBoton7; }
            set { _logVerBoton7 = value; RaisePropertyChangedEvent("logVerBoton7"); }
        }

        private Boolean _logVerBoton8 = false;
        public Boolean logVerBoton8
        {
            get { return _logVerBoton8; }
            set { _logVerBoton8 = value; RaisePropertyChangedEvent("logVerBoton8"); }
        }

        private Boolean _logVerBoton9 = false;
        public Boolean logVerBoton9
        {
            get { return _logVerBoton9; }
            set { _logVerBoton9 = value; RaisePropertyChangedEvent("logVerBoton9"); }
        }

        private Boolean _logVerBoton10 = false;
        public Boolean logVerBoton10
        {
            get { return _logVerBoton10; }
            set { _logVerBoton10 = value; RaisePropertyChangedEvent("logVerBoton10"); }
        }

        private Boolean _logVerBoton11 = false;
        public Boolean logVerBoton11
        {
            get { return _logVerBoton11; }
            set { _logVerBoton11 = value; RaisePropertyChangedEvent("logVerBoton11"); }
        }

        private Boolean _logVerBoton12 = false;
        public Boolean logVerBoton12
        {
            get { return _logVerBoton12; }
            set { _logVerBoton12 = value; RaisePropertyChangedEvent("logVerBoton12"); }
        }

        private List<valoresPedidos> _listabla1 = new List<valoresPedidos>();
        public List<valoresPedidos> listabla1
        {
            get { return _listabla1; }
            set { _listabla1 = value; RaisePropertyChangedEvent("listabla1"); }
        }

        private List<valoresPedidos> _listabla2 = new List<valoresPedidos>();
        public List<valoresPedidos> listabla2
        {
            get { return _listabla2; }
            set { _listabla2 = value; RaisePropertyChangedEvent("listabla2"); }
        }

        private List<clTabla1> _listado1 = new List<clTabla1>();
        public List<clTabla1> listado1
        {
            get { return _listado1; }
            set { _listado1 = value; RaisePropertyChangedEvent("listado1"); }
        }

        private List<clTabla2> _listado2 = new List<clTabla2>();
        public List<clTabla2> listado2
        {
            get { return _listado2; }
            set { _listado2 = value; RaisePropertyChangedEvent("listado2"); }
        }

        //-------------------------------------------------------- Fin Propiedades graficos
        

    #endregion

    #region clases

    public class arbol:ObservableObject
    {

        private ObservableCollection<arbol> _hijos=new ObservableCollection<arbol>();
        public ObservableCollection<arbol> hijos 
        {
            get { return _hijos; }
            set { _hijos = value; RaisePropertyChangedEvent("hijos"); }
        }

        private arbol _padre;
        public arbol padre
        {
            get { return _padre; }
            set { _padre = value; RaisePropertyChangedEvent("padre"); }
        }

        private int _id;
        public int id 
        {
            get { return _id; }
            set { _id = value; RaisePropertyChangedEvent("id"); }
        }

        private string _nombre;
        public string nombre
        {
            get { return _nombre; }
            set { _nombre = value; RaisePropertyChangedEvent("nombre"); }
        }

        private string _padreid;
        public string padreid
        {
            get { return _padreid; }
            set { _padreid = value; RaisePropertyChangedEvent("padreid"); }
        }

        private string _orden;
        public string orden
        {
            get { return _orden; }
            set { _orden = value; RaisePropertyChangedEvent("orden"); }
        }
    
        private string _usuario;
        public string usuario
        {
            get { return _usuario; }
            set { _usuario = value; RaisePropertyChangedEvent("usuario"); }
        }

        private string _formulario;
        public string formulario
        {
            get { return _formulario; }
            set { _formulario = value; RaisePropertyChangedEvent("formulario"); }
        }

        private string _tipo;
        public string tipo
        {
            get { return _tipo; }
            set { _tipo = value; RaisePropertyChangedEvent("tipo"); }
        }

        private Boolean _IsExpanded;
        public Boolean IsExpanded
        {
            get { return _IsExpanded; }
            set { _IsExpanded = value; RaisePropertyChangedEvent("IsExpanded"); }
        }

        private Boolean _IsSelected;
        public Boolean IsSelected
        {
            get { return _IsSelected; }
            set { _IsSelected = value; RaisePropertyChangedEvent("IsSelected"); }
        }

    }

     public class favorito : ObservableObject 
     {

        public ObservableCollection<favorito> cargar() 
        {

            DataTable val = new clases.CLSFAVUSUP().consultar();
            ObservableCollection<favorito> fav=new ObservableCollection<favorito>();
            int c = 0;
            foreach(DataRow r in val.Rows)
            {
                fav.Add(new favorito 
                {
                    CONSEC_FUS = Convert.ToInt32(r["CONSEC_FUS"]),
                    CODHIJO_FUS = Convert.ToInt32(r["CODHIJO_FUS"]),
                    NOMBRE_OPC = r["NOMBRE_OPC"].ToString().Trim(),
                    FORMUL_OPC = r["FORMUL_OPC"].ToString(),
                    CODUSU_OPU = r["CODUSU_OPU"].ToString(),
                    Indexf=c
                });
                c = c+1;
            }
            return fav;
        }

        clases.CLSFAVUSUP FAVUSUP = new clases.CLSFAVUSUP();

        public int quitar() 
        {
            return FAVUSUP.eliminar();
        }
        public int agregar() 
        {
            return FAVUSUP.insertar();
        }
        public int ordenar(int pos)
        {
            return FAVUSUP.ordenar(pos);
        }
        public Boolean yaesta() 
        {
            return FAVUSUP.existe();
        }

        public int CONSEC_FUS
        {
            get {return FAVUSUP.CONSEC_FUS;}
            set { FAVUSUP.CONSEC_FUS = value; RaisePropertyChangedEvent("CONSEC_FUS"); }
        }

        public int CODHIJO_FUS
        {
            get { return FAVUSUP.CODHIJO_FUS; }
            set {  FAVUSUP.CODHIJO_FUS=value; RaisePropertyChangedEvent("CODHIJO_FUS"); }
        }

        public string CODUSU_OPU
        {
            get { return FAVUSUP.CODUSU_FUS; }
            set { FAVUSUP.CODUSU_FUS = value; RaisePropertyChangedEvent("CODUSU_OPU"); }
        }
    
        private string _NOMBRE_OPC;
        public string NOMBRE_OPC
        {
            get { return _NOMBRE_OPC; }
            set{ _NOMBRE_OPC=value; RaisePropertyChangedEvent("NOMBRE_OPC"); }
        }

        private string _FORMUL_OPC;
        public string FORMUL_OPC
        {
            get { return _FORMUL_OPC; }
            set { _FORMUL_OPC=value; RaisePropertyChangedEvent("FORMUL_OPC"); }
        }

        private Boolean _IsSelected;
        public Boolean IsSelected
        {
            get { return _IsSelected; }
            set { _IsSelected = value; RaisePropertyChangedEvent("IsSelected"); }
        }

        private int _Indexf;
        public int Indexf
        {
            get { return _Indexf; }
            set { _Indexf = value; RaisePropertyChangedEvent("Indexf"); }
        }

    }
    
    // Clases para los graficos
    public class valoresPedidos
    {
        public string strLinea { get; set; }
        public Int32 numValor { get; set; }
    }

    public class clTabla1
    {
        public string strValor { get; set; }
        public Int32 numValor1 { get; set; }
        public Int32 numValor2 { get; set; }
    }

    public class clTabla2
    {
        public string strValor { get; set; }
        public Int32 numValor1 { get; set; }
    }

  
    // Fin Clases para los graficos

    #endregion

    #region metodos

        public void consultar() 
        {
            try
            {
                val = new clases.CLSMAEOPCP { CODUSU = MDOgeneral.usuario }.consultar();
                consultarMenu(0, null);
                lisfav = new menu.favorito().cargar();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public DataTable val { get; set; }
        
        public void consultarMenu(int indicepadre,arbol nodopadre)
        {
            DataView vista = new DataView(val);
            vista.RowFilter = val.Columns["CODPADRE_OPC"].ColumnName + " = " + indicepadre;
            foreach (DataRowView r in vista)
            {
                arbol nodo = new arbol 
                {
                    nombre = r["NOMBRE_OPC"].ToString().Trim(),
                    padreid=r["CODPADRE_OPC"].ToString(),
                    tipo = r["TIPO_OPC"].ToString(),
                    id=Convert.ToInt32(r["CODHIJO_OPC"]),
                    orden=r["ORDEN_OPC"].ToString(),
                    formulario=r["FORMUL_OPC"].ToString(),
                    usuario=r["CODUSU_OPU"].ToString()
                };

                if (nodopadre == null)
                {
                    nodo.padre = padre;
                    hijos.Add(nodo);
                    padre.hijos = hijos;
                }
                else
                {
                    nodo.padre = nodopadre;
                    nodopadre.hijos.Add(nodo);
                }
                consultarMenu(Convert.ToInt32(r["CODHIJO_OPC"]),nodo);
            }
        }

        public void SubirFav() 
        {
            if (self.Indexf > 0) 
            {
                int i = Indexf;
                self.ordenar(lisfav[self.Indexf-1].CONSEC_FUS);
                lisfav = self.cargar();
                self = lisfav[i-1];
            }     
        }

        public void BajarFav()
        {
            if (self.Indexf < lisfav.Count-1) 
            {
                int i = Indexf;
                self.ordenar(lisfav[self.Indexf + 1].CONSEC_FUS);
                lisfav = self.cargar();
                self = lisfav[i + 1];
            }
        }

        public void QuitarFav() 
        {
            if (Indexf == -1)
            {
                return;
            }
            if (self.yaesta())
            {
                if (self.quitar() > 0)
                {
                    new MDOgeneral.notificar(wPNot, "La opción '"+self.NOMBRE_OPC+"' se quito de su lista de favoritos.", true);
                    int i = Indexf;
                    if (i == lisfav.Count - 1) 
                    {
                        i = i - 1;
                    }
                    if (lisfav.Count==1) 
                    {
                        i = -1;
                    }
                    lisfav = self.cargar();
                    Indexf = i;
                }
                else 
                {
                    new MDOgeneral.notificar(wPNot, "La opción '" + self.NOMBRE_OPC + "' no pudo ser quitada de su lista de favoritos.", false);
                }
            }
        }

        public void AgregarFav() 
        {
            if (String.IsNullOrEmpty(sel.nombre)) 
            {
                return;
            }

            if (!sel.tipo.Equals("A"))
            {
                return;
            }

            favorito opcion = new favorito { CODHIJO_FUS = sel.id };

            if (opcion.yaesta()) {
                new MDOgeneral.notificar(wPNot, "La opción '" + sel.nombre + "' ya existe en su lista de favoritos.", false);
                return;
            }

            if (opcion.agregar() > 0)
            {
                new MDOgeneral.notificar(wPNot, "La opción '" + sel.nombre + "' se agrego a su lista de favoritos.", true);
                lisfav = opcion.cargar();
                self=lisfav.Last();
            }
            else 
            {
                new MDOgeneral.notificar(wPNot, "La opción '" + sel.nombre + "' no pudo ser quitada de su lista de favoritos.", false);
            }
        }

        //Busqueda en menu
        IEnumerator<arbol> _buscandoapp;
        public  void PerformSearch()
        {
            if (String.IsNullOrEmpty(texMenBus) || String.IsNullOrWhiteSpace(texMenBus))
                return;

            if (_buscandoapp== null || !_buscandoapp.MoveNext())
                this.VerifyMatchingItemEnumerator();

            var item = _buscandoapp.Current;

            if (item == null)
                return;

            camm = true;
            item.IsExpanded = true;
            item.IsSelected = true;
            sel = item;
      
            arbol a = item;
            new MDOgeneral.notificar(wPNot,"Coincidencia encontrada '"+item.nombre+"'.",true);
            while (a.padre != null) 
            { 
                a.padre.IsExpanded = true;
                a.padre.IsSelected = false; 
                a = a.padre;        
            }
        }
        
        void VerifyMatchingItemEnumerator()
        {
            var matches = this.FindMatches(texMenBus, padre);
            _buscandoapp = matches.GetEnumerator();

            if (!_buscandoapp.MoveNext())
            {
                new MDOgeneral.notificar(wPNot, "No se encuentran coincidencias para su busqueda.", false);
            }
        }
        
        IEnumerable<arbol> FindMatches(string searchText, arbol item)
        {
            if (item.nombre.ToUpper().Contains(searchText.ToUpper()))
                yield return item;

            foreach (arbol child in item.hijos)
                foreach (arbol match in this.FindMatches(searchText, child))
                    yield return match;
        }


        //Busqueda favoritos
        string camfv;
        IEnumerator<favorito> _buscandofav;
        public void PerformSearchfav()
        {
            if (camfv == null) camfv = texFavBus;

            if (String.IsNullOrEmpty(texFavBus) || String.IsNullOrWhiteSpace(texFavBus))
                return;

            if (_buscandofav == null || !_buscandofav.MoveNext()||texFavBus!=camfv)
                this.VerifyMatchingItemEnumeratorfav();
            camfv = texFavBus;

            var item = _buscandofav.Current;

            if (item == null)
                return;

            item.IsSelected = true;
            Indexf = item.Indexf;
            new MDOgeneral.notificar(wPNot, "Coincidencia encontrada '" + item.NOMBRE_OPC + "'.", true);
        }

        void VerifyMatchingItemEnumeratorfav()
        {
            var matches = this.FindMatchesfav(texFavBus);
            _buscandofav = matches.GetEnumerator();

            if (!_buscandofav.MoveNext())
            {
                new MDOgeneral.notificar(wPNot, "No se encuentran coincidencias para su busqueda.", false);
            }
        }

        IEnumerable<favorito> FindMatchesfav(string searchText)
        {
            return lisfav.Where(x => x.NOMBRE_OPC.ToUpper().Contains(searchText.ToUpper()));
        }

        // Cargar graficos
        public void cargarGraficos(string strGrafico)
        {
            try
            {
                Mouse.OverrideCursor = Cursors.Wait;
                // Consulta el sp con la informqación de las graficas
                ProcesoProduccionRepositorio _repos = new ProcesoProduccionRepositorio();
                List<MGraficas> tab = new List<MGraficas>();
                _repos.consultaGraficas(tab, strGrafico);

                if (strGrafico == "Z") { strGrafico = "1"; }

                // Lista con los nombres y titulos de las graficas
                List<MGraficas> unicos = tab.GroupBy(p => new { p.strInforme, p.strTitulo, p.strTitulo1, p.strTitulo2, p.strNombre } ).Select(g => g.First()).ToList();
                foreach (MGraficas un in unicos)
                {
                    switch (un.strInforme)
                    {
                        case "1":
                            logVerBoton1 = true;
                            strNombreGrafico1 = un.strTitulo;
                            break;
                        case "2":
                            logVerBoton2 = true;
                            strNombreGrafico2 = un.strTitulo;
                            break;
                        case "3":
                            logVerBoton3 = true;
                            strNombreGrafico3 = un.strTitulo;
                            break;
                        case "4":
                            logVerBoton4 = true;
                            strNombreGrafico4 = un.strTitulo;
                            break;
                        case "5":
                            logVerBoton5 = true;
                            strNombreGrafico5 = un.strTitulo;
                            break;
                        case "6":
                            logVerBoton6 = true;
                            strNombreGrafico6 = un.strTitulo;
                            break;
                        case "7":
                            logVerBoton7 = true;
                            strNombreGrafico7 = un.strTitulo;
                            break;
                        case "8":
                            logVerBoton8 = true;
                            strNombreGrafico8 = un.strTitulo;
                            break;
                        case "9":
                            logVerBoton9 = true;
                            strNombreGrafico9 = un.strTitulo;
                            break;
                        case "10":
                            logVerBoton10 = true;
                            strNombreGrafico10 = un.strTitulo;
                            break;
                        case "11":
                            logVerBoton11 = true;
                            strNombreGrafico11 = un.strTitulo;
                            break;
                        case "12":
                            logVerBoton12 = true;
                            strNombreGrafico12 = un.strTitulo;
                            break;
                        default:
                            break;
                    }
                }


                // Limpia las listas
                listado1.Clear();
                listado2.Clear();
                listabla1.Clear();
                listabla2.Clear();

                // Lista con el informe que se quiere ver
                List<MGraficas> infor = (from inf in tab where inf.strInforme == strGrafico select inf).ToList();


                foreach (MGraficas gr in infor)
                {
                    if (gr.numValor2 > 0)
                    {
                        logVerGrafico1 = true;
                        logVerGrafico2 = false;

                        listabla1.Add(new valoresPedidos
                        {
                            strLinea = gr.strLinea.Substring(0, 3),
                            numValor = gr.numValor1
                        });
                        listabla2.Add(new valoresPedidos
                        {
                            strLinea = gr.strLinea.Substring(0, 3),
                            numValor = gr.numValor2
                        });
                        listado1.Add(new clTabla1
                        {
                            strValor = gr.strLinea,
                            numValor1 = gr.numValor1,
                            numValor2 = gr.numValor2
                        });
                    }
                    else
                    {
                        if (gr.numValor1 > 0)
                        {
                            logVerGrafico1 = false;
                            logVerGrafico2 = true;

                            listabla1.Add(new valoresPedidos
                            {
                                strLinea = gr.strLinea.Substring(0, 6),
                                numValor = gr.numValor1
                            });
                            listado2.Add(new clTabla2
                            {
                                strValor = gr.strLinea,
                                numValor1 = gr.numValor1
                            });
                        }
                    }

                    strNombreGrafico = gr.strTitulo;
                    strNombreColumna1 = gr.strNombre;
                    strNombreColumna2 = gr.strTitulo1;
                    strNombreColumna3 = gr.strTitulo2;
                   
                }

                RaisePropertyChangedEvent("listabla1");
                RaisePropertyChangedEvent("listabla2");
                RaisePropertyChangedEvent("listado1");
                RaisePropertyChangedEvent("listado2");


                //MessageBox.Show("Acabo");
                Mouse.OverrideCursor = Cursors.Arrow;

                // http://stackoverflow.com/questions/5002786/multiple-series-charts-with-wpftoolkit
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        // Fin cargar graficos

     #endregion

    }
}
